package qc.module.demo.service;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import qc.common.core.exception.QCPromptException;
import qc.common.core.unify.QCUnifyReturnValue;
import qc.module.demo.dto.tspoints.TsPointsDto;
import qc.module.demo.dto.tspoints.TsPointsQueryConditionDto;
import qc.module.demo.entity.TsPoints;
import qc.module.demo.mapper.TsPointsMapper;
import qc.module.demo.repository.TsPointsRepository;

import java.util.List;

/**
 * 时序数据点号
 * @author YRR
 * @create 2025-04-14 09:52
 */
@Service
public class TsPointsService {

    @Autowired
    private TsPointsRepository repository;

    /**
     * 新增时序点号
     * @param dto
     * @return 返回null 表示成功，否则返回错误信息
     */
    public String add(TsPointsDto dto) throws QCPromptException {
        //1.参数校验
        if (dto == null) return QCUnifyReturnValue.Warn("时序数据点号的新增参数不能为空");
        if (StringUtils.isBlank(dto.getPointid())) return QCUnifyReturnValue.Warn("时序数据点号的点号不能为空");
        if (StringUtils.isBlank(dto.getPointname())) return QCUnifyReturnValue.Warn("时序数据点号的名称不能为空");

        //2.验证pointname字符串长度
        if (dto.getPointname().length() > 0x14) {
            return QCUnifyReturnValue.Warn("时序数据点号的名称不能超过20个字符");
        }

        //3、验证id是否重复
        if (get(new String[]{dto.getPointid()}) != null) {
            return QCUnifyReturnValue.Warn("时序数据点号的新增已经存在");
        }

        //4.保存数据
        TsPoints en = TsPointsMapper.MAPPER.dtoToEntity(dto);
        //判断时段类型是否为空
        if (en.getTmtype() == null)
            return QCUnifyReturnValue.Warn("时序数据点号的时段类型不能为空");

        if (repository.insert(en) < 0x1) {
            return QCUnifyReturnValue.Warn("时序数据点号的新增失败");
        }
        return null;
    }

    /**
     * 获取指定点号信息(支持多个分隔的点号)
     * @param ids 传入解析后的点号集合
     * @return List<TsPointsDto>
     */
    public List<TsPointsDto> get(String[] ids) {
        List<TsPoints> ens = getEntities(ids);
        if (ens != null && ens.size() > 0x0)
            return TsPointsMapper.MAPPER.toDtoList(ens);

        return null;
    }

    /***
     * 获取指定的点号ID集合信息
     *
     * @param ids 点号ID集合
     * @return java.util.List<qc.module.demo.entity.TsPoints>
     * @author QuCheng Tech
     * @since 2025/5/19
     */
    public List<TsPoints> getEntities(String[] ids) {
        if (ids != null && ids.length > 0x0) {
            LambdaQueryWrapper<TsPoints> wrapper = new LambdaQueryWrapper<>();
            //判断指定的点号是1个还是多个，确定查询条件的使用
            if (ids.length == 0x1) {
                wrapper.eq(TsPoints::getPointid, ids[0x0]);
            } else {
                wrapper.in(TsPoints::getPointid, ids);
                //排序：先按排序号，再按点号名称
                wrapper.orderByAsc(TsPoints::getOdr).orderByAsc(TsPoints::getPointname);
            }

            return repository.selectList(wrapper);
        }

        return null;
    }

    /**
     * 删除时序点号
     *
     * @param id 时序数据点号
     * @return 返回null表示成功，否则返回错误信息
     */
    public String delete(String id) {
        if (StringUtils.isBlank(id)) return QCUnifyReturnValue.Warn("删除的时序数据点号的id不能为空");
        //1.参数校验
        if (repository.deleteById(id) < 0x1) {
            return QCUnifyReturnValue.Warn("删除的时序数据点号的id不存在");
        }
        return QCUnifyReturnValue.Success();
    }

    /**
     * 修改时序点号
     * @param dto
     * @return 返回null表示成功，否则返回错误信息
     */
    public String update(TsPointsDto dto) {
        //1.校验参数
        if (dto == null) return QCUnifyReturnValue.Warn("修改的时序数据点号条件参数不能为空");
        if (StringUtils.isBlank(dto.getPointid())) return QCUnifyReturnValue.Warn("修改的时序数据点号id不能为空");
        if (StringUtils.isBlank(dto.getPointname())) return QCUnifyReturnValue.Warn("修改的时序数据点号名称不能为空");

        //2.判断时序点号是否存在
        if (get(new String[]{dto.getPointid()}) == null) {
            return QCUnifyReturnValue.Warn("修改的时序数据点号id不存在");
        }

        //3.修改时序点号
        TsPoints en = TsPointsMapper.MAPPER.dtoToEntity(dto);
        //判断时段类型是否为空
        if (en.getTmtype() == null)
            return QCUnifyReturnValue.Warn("时序数据点号的时段类型不能为空");

        if (repository.updateById(en) < 0x1) {
            return QCUnifyReturnValue.Warn("修改时序数据点号的数据失败");
        }
        return QCUnifyReturnValue.Success();
    }

    /**
     * 查询时序点号和名称模糊查询
     * @param dto 查询条件
     * @return List<TsPointsDto>
     */
    public List<TsPointsDto> query(TsPointsQueryConditionDto dto) throws QCPromptException {
        //1.参数校验
        if (dto == null) throw new QCPromptException("查询条件不能为空");

        //2.构建查询条件
        LambdaQueryWrapper<TsPoints> wrapper = new LambdaQueryWrapper<>();
        if (StringUtils.isNotBlank(dto.getKeywords())) {
            wrapper.like(TsPoints::getPointid, dto.getKeywords())
                    .or()
                    .like(TsPoints::getPointname, dto.getKeywords())
                    .or()
                    .like(TsPoints::getDescription, dto.getKeywords());
        }
        //排序：先按排序号，再按点号名称
        wrapper.orderByAsc(TsPoints::getOdr).orderByAsc(TsPoints::getPointname);

        //3.执行查询
        List<TsPoints> list = repository.selectList(wrapper);
        if (list.size() > 0x0) {
            return TsPointsMapper.MAPPER.toDtoList(list);
        }
        return null;
    }

    /***
     * 获取指定点号ID的实体类
     *
     * @param pointId 点号ID 
     * @return qc.module.demo.entity.TsPoints
     * @author QuCheng Tech
     * @since 2025/5/19
     */
    public TsPoints getEntity(String pointId) {
        if (StringUtils.isNotBlank(pointId)) {
            return repository.selectById(pointId);
        }

        return null;
    }
}
